package com.ysj.demo.rxjavatest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.util.ArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * RxJava测试
 */
public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private static int a = 1;//1代表线程1 2线程2
    private ArrayList<Integer> arrayList = new ArrayList<>();
    private final Lock threadLock = new ReentrantLock();
    private Thread aThread, bThread, cThread;
    private int count = 10;
    private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    final Object t = new Object();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(){
            public void run() {
                get(Thread.currentThread());
            }
        }.start();

        new Thread(){
            public void run() {
                get(Thread.currentThread());
            }
        }.start();

//        aThread = new Thread(new Runnable() {
//            public void run() {
//                while (true) {
//                    // 锁定
//                    threadLock.lock();
//                    try {
//                        if (count < 1) {
//                            return;
//                        }
//                        if (count % 2 == 0) {
//                            // aThread的任务
//                            Log.d(TAG, "aThread --> " + count);
//                            count--;
//                        }
//                    } catch (Exception e) {
//                        // TODO: handle exception
//                    } finally {
//                        // 释放锁
//                        threadLock.unlock();
//                    }
//                }
//            }
//        });
//
//        bThread = new Thread(new Runnable() {
//            public void run() {
//                while (true) {
//                    // 锁定
//                    threadLock.lock();
//                    try {
//                        if (count < 1) {
//                            return;
//                        }
//                        if (count % 2 == 1) {
//                            // aThread的任务
//                            Log.d(TAG, "bThread --> " + count);
//                            count--;
//                        }
//                    } catch (Exception e) {
//                        // TODO: handle exception
//                    } finally {
//                        // 释放锁
//                        threadLock.unlock();
//                    }
//                }
//            }
//        });

//        cThread = new Thread(new Runnable() {
//            public void run() {
//                while (true) {
//                    // 锁定
//                    threadLock.lock();
//                    try {
//                        if (count < 1) {
//                            return;
//                        }
//                        if (count % 3 == 2) {
//                            // aThread的任务
//                            Log.d(TAG, "cThread --> " + count);
//                            count--;
//                        }
//                    } catch (Exception e) {
//                        // TODO: handle exception
//                    } finally {
//                        // 释放锁
//                        threadLock.unlock();
//                    }
//                }
//            }
//        });

 //       startTwoThread();
//        new Thread(){
//            @Override
//            public void run() {
//                insert(Thread.currentThread());
//            }
//        }.start();
//
//        new Thread(){
//            @Override
//            public void run() {
//                insert(Thread.currentThread());
//            }
//        }.start();

//        final Object t = new Object();
//
//        new Thread(new Runnable() {
//
//            @Override
//            public void run() {
//                synchronized (t) {
//                    Log.d(TAG,"进入循环");
//                    for (int i = 1; i <= 10; i++) {
//                        if (i == 6) {
//                            try {
//                                a = 2;//切换线程2
//                                Log.d(TAG,"进入等待，不执行输出数字操作");
//                                t.wait();//线程1等待,并释放了对象的锁
//                            } catch (Exception e) {
//                                e.printStackTrace();
//                            }
//                        }
//                        Log.d(TAG,"输出数字");
//                        Log.d(TAG, Thread.currentThread().getName() + ":" + i);
//                    }
//                }
//            }
//        }).start();
//
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                Log.d(TAG,"线程2开始");
//                synchronized (t) {
//                    Log.d(TAG,"进入线程2");
////                    if (a != 2) {//没有轮到，进入等待
////                        try {
////                            Log.d(TAG,"进入等待，不执行以下操作");
////                            t.wait();
////                        } catch (InterruptedException e) {
////                            e.printStackTrace();
////                        }
////                    }
//                    Log.d(TAG, "hello");
//                    t.notifyAll();
//
//                }
//
//            }
//
//        }).start();

        // Test.five();
//        Object a = new Object();
//        Object b = new Object();
//        Object c = new Object();
//
//        MyThreadPrinter2 pa = new MyThreadPrinter2("C",a,c);
//        MyThreadPrinter2 pb = new MyThreadPrinter2("B",c,b);
//        MyThreadPrinter2 pc = new MyThreadPrinter2("A",b,a);
//
//        new Thread(pa).start();
//        try {
//            Thread.sleep(100);
//        }catch (InterruptedException e){
//            e.printStackTrace();
//        }
//
//        new Thread(pb).start();
//        try {
//            Thread.sleep(100);
//        }catch (InterruptedException e){
//            e.printStackTrace();
//        }
//
//        new Thread(pc).start();
//        try {
//            Thread.sleep(100);
//        }catch (InterruptedException e){
//            e.printStackTrace();
//        }
    }

//    public class MyThreadPrinter2 implements Runnable {
//
//        private String name;
//        private Object prev;
//        private Object self;
//
//        private MyThreadPrinter2(String name, Object prev, Object self) {
//            this.name = name;
//            this.prev = prev;
//            this.self = self;
//        }
//
//        @Override
//        public void run() {
//            int count = 10;
//            while (count > 0) {
//                synchronized (prev) {
//                    synchronized (self) {
//                        Log.d("输出排序",name);
//                     //   System.out.print(name);
//                        count--;
//                        self.notify();
//                    }
//                    try {
//                        prev.wait();
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                }
//            }
//        }
//    }

    public void startTwoThread() {
        aThread.start();
        bThread.start();
     //   cThread.start();
    }

    public void get(Thread thread) {
        rwl.readLock().lock();
        try {
            long start = System.currentTimeMillis();

            while(System.currentTimeMillis() - start <= 1) {
                Log.d(TAG,thread.getName() + "正在进行读操作");
            }
            Log.d(TAG,thread.getName()+"读操作完毕");
        } finally {
            rwl.readLock().unlock();
        }
    }

//    public void insert(Thread thread){
//        lock.lock();
//        try {
//            Log.d(TAG, thread.getName() + "得到了锁");
//            for(int i = 0;i < 5;i++){
//                arrayList.add(i);
//            }
//        }catch (Exception e){
//
//        }finally {
//            Log.d(TAG,thread.getName()+ "释放了锁");
//            lock.unlock();
//        }
//
//    }
}
